class_name PlayArea
extends Node2D
## 版本：0.1.0
## 功能：构成由游戏地图、单元网格构成的一个游戏性区域
## 使用：挂载到 Node2D 节点上，作为游戏性区域的父节点，配置 tile_map_layer 和 unit_grid 导出变量。
## 注意：请确保 PlayArea 节点是正确的位置，而 TileMapLayer 可以是原点
## 前置：UnitGrid

## 游戏性区域的瓦片地图
@export var tile_map_layer: TileMapLayer

## 游戏性区域的单元网格
@export var unit_grid: UnitGrid

## 单元部署在游戏性区域中的位置偏移
@export var position_offset: Vector2


func add_unit_to_empty_cell(unit: Variant, coord: Vector2i) -> bool:
	if not unit_grid.add_unit_to_empty_cell(unit, coord):
		return false
	
	if unit.get_parent():
		unit.reparent(self)
	else:
		add_child(unit)

	# 将单元布置在地图中
	unit.global_position = get_global_position_by_cell_coord(coord) + position_offset
	return true


func add_unit_to_first_empty_cell(unit: Variant) -> bool:
	return add_unit_to_empty_cell(unit, unit_grid.get_first_empty_cell_coord())


func remove_unit_by_cell_coord(coord: Vector2i) -> bool:
	var unit = unit_grid.get_unit(coord)
	if unit_grid.remove_unit_by_cell_coord(coord):
		remove_child(unit)
		return true
	else:
		return false


func remove_unit(unit: Variant) -> bool:
	if unit_grid.remove_unit(unit):
		remove_child(unit)
		return true
	else:
		return false


func get_global_position_by_cell_coord(coord: Vector2i) -> Vector2:
	return to_global(tile_map_layer.map_to_local(coord))


func get_cell_coord_by_global_position(in_global_position: Vector2) -> Vector2i:
	return tile_map_layer.local_to_map(to_local(in_global_position))
